#include "HashBucket.hpp"

template<class K,class V,class HashFunc=HashDefault<K>>
class unordered_map
{
  struct KeyOfMap 
  {
    const K& operator()(const pair<K,V>& kv)
    {
      return kv.first;
    }
  };
public:
  typedef typename HashBucket<K,pair<K,V>,KeyOfMap,HashFunc>::iterator iterator;

  iterator begin()
  {
    return _ht.begin();
  }

  iterator end()
  {
    return _ht.end();
  }

  pair<iterator,bool> insert(const pair<K,V>& kv)
  {
    return _ht.insert(kv);
  }
  bool erase(const K& key)
  {
    return _ht.erase(key);
  }
  iterator find(const K& key)
  {
    return _ht.find(key);
  }

  V& operator[](const K& key)
  {
    //pair<iterator,bool> ret=insert(make_pair(key,V()));
    //return ret.first->second;
    return (*(insert(make_pair(key,V())).first)).second;
  }

  void print()
  {
    return _ht.printMap();
  }

private:
  HashBucket<K,pair<K,V>,KeyOfMap,HashFunc> _ht;
};
